草庐IT

C++ unique_ptr 和映射

全部标签

c++ - 如果键已经存在,为什么 STL 映射会插入另一个值,而不仅仅是更改它?

为什么我使用STL映射的程序在键已经存在时插入值而不是更改现有值?#include#includeusingnamespacestd;structCTest{inta,b,c;CTest(intA,intB,intC):a(A),b(B),c(C){}};booloperatorr.a)returnfalse;if(l.br.b)returnfalse;if(l.cr.c)returnfalse;returntrue;}structCTest2{booloperator>x;x[CTest(1,1,1)]["lol"]=CTest2(1,2);//x[CTest(1,1,1)]["lo

c++ - 在工厂中返回 unique_ptr

也许这是一个简单的问题,因为我对C++还是个新手。我想使用某种工厂来封装我的应用程序中的日志记录。这个想法是只有工厂知道哪个具体类将处理函数调用。应用程序将始终调用基本日志记录类的抽象接口(interface)。工厂方法应该是这样的:std::unique_ptrFactory::getDefaultLogger(conststd::string¶m){returnnewConcreteLoggingClass(param);}ConcreteLoggingClass是AbstractLoggingClass的子类。但是我得到以下错误:Error:couldnotconvert

c++ - 是否保证 std::unique_ptr 删除顺序?

我正在制作一个控制我的应用程序的全局单例,我希望子系统以特定顺序启动和关闭。classApp{public:App();~App();voidstart();voidrun();voidshutdown();private:std::unique_ptrdisplayManager;std::unique_ptrrenderer;};构造函数以正确的顺序创建指针App::App(){displayManager=std::unique_ptr(newDisplayManager);renderer=std::unique_ptr(newRenderer);}并且我希望以相反的顺序释放u

c++ - 手动递增和递减 boost::shared_ptr?

有没有办法在C++中手动增加和减少shared_ptr的计数?我要解决的问题如下。我正在用C++编写一个库,但接口(interface)必须是纯C语言。在内部,我想使用shared_ptr来简化内存管理,同时保留通过C接口(interface)传递原始指针的能力。当我通过接口(interface)传递原始指针时,我想增加引用计数。然后客户端将负责调用一个函数,该函数将在不再需要传递的对象时减少引用计数。 最佳答案 也许您正在跨DLL边界使用boost::shared_ptr,这将无法正常工作。在这种情况下boost::intrusi

C++ weak_ptr创建性能

我已经读到创建或复制std::shared_ptr会涉及一些开销(引用计数器的原子增量等)。但是如何从中创建std::weak_ptr呢?Obj*obj=newObj();//fastObj*o=obj;//slowstd::shared_ptra(o);//slowstd::shared_ptrb(a);//slow?std::weak_ptrc(b);我希望能够获得更快的性能,但是我知道共享指针仍然必须增加弱引用计数器。那么,这仍然像将shared_ptr复制到另一个一样慢吗? 最佳答案 除了Alec's非常有趣的描述他以前的项

c++ - 在 C++ 中搜索和插入具有 3 个元素的映射

我需要一张这样的map:typedefstd::mapMaptype;在此映射中插入和搜索pair元素的语法是什么。 最佳答案 map只能将一种键类型映射到一种数据类型。如果数据包含2个元素,请使用结构或std::pair。typedefstd::map>Maptype;...Maptypem;m[123]=std::make_pair(0.5f,'c');...std::pairval=m[245];std::cout 关于c++-在C++中搜索和插入具有3个元素的映射,我们在Stac

c++ - std::move 与 std::auto_ptr 相比?

我可以用C++11中的“移动”(右值引用)做什么我不能用std::auto_ptr做什么?(据我了解,它们是一个想法的不同实现。)老问题又来了:std::auto_ptr是这么糟糕的组件吗? 最佳答案 C++98/03没有真正“可移动”类的概念。auto_ptr是一个具有transfer-on-copy-semantics的类,即当您制作拷贝时,原始内容会发生变化(注意带有非常量参数的复制构造函数!)。这是不好的。这样的类不能在标准容器中使用。由于新添加的右值引用概念,C++11引入了真正可移动类的概念。新的unique_ptr完全

c++ - 我如何使用 _com_ptr_t?

假设我有一个拥有D3DDevice的类:classThing{public:Thing(){D3D11CreateDevice(...,&device,...);}~Thing(){device->Release();}private:ID3D11Device*device;};据我所知,我可以使用_com_ptr_t来确保删除对象,而不必在析构函数中显式调用Release()。但问题是我无法找出模板的正确语法。我几乎找不到关于_com_ptr_t的任何信息,我能找到的最接近答案的是this(Japanese)one.按照那里的语法,我得到了一堆编译器错误:private://ID3D

具有类键和类值的 C++ STL 映射容器

假设我有这样一个类:classPoint{private:intx,y;public:voidsetX(intarg_x){x=arg_x;}voidsety(intarg_y){y=arg_y;}intgetX()const{returnx;}intgety()const{returny;}};现在我想要一张这样的map:mapm;但是我需要第三个参数。我在cplusplus里读到这第三个参数是用来比较什么的,但是没看懂那是什么东西。谁能给我解释一下? 最佳答案 如果您不需要单独的比较函数,您可以使用这样的方法扩展您的类class

c++ - unique_ptr 的取消引用运算符在 Eclipse 中不起作用

按照thispost中的步骤操作后我设法让Eclipse(Indigo)识别unique_ptr(和其他C++11新东西)。问题是operator->forunique_ptr似乎在Eclipse中不受支持。这里有一个例子:classFoo{voidbar(){/*...*/}};std::unique_ptrfoo;(*foo).bar();//1foo->bar();//2Case1按预期工作:没有错误并且自动完成工作。然而,对于案例2,Eclipse将语句标记为错误(“无法解析方法'bar'”),而且foo->的自动完成功能不起作用。最有趣的是,我对std::shared_ptr